package org.example.erat.log.core;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 日志记录器单例类
 * 使用单例模式实现日志记录
 */
public class LoggerSingleton {
    
    private static LoggerSingleton instance;
    private final Logger logger;
    private final List<LogObserver> observers = new ArrayList<>();
    
    /**
     * 私有构造函数
     */
    private LoggerSingleton() {
        logger = LoggerFactory.getLogger(LoggerSingleton.class);
    }
    
    /**
     * 获取单例实例
     * @return 单例实例
     */
    public static synchronized LoggerSingleton getInstance() {
        if (instance == null) {
            instance = new LoggerSingleton();
        }
        return instance;
    }
    
    /**
     * 添加日志观察者
     * @param observer 观察者
     */
    public void addObserver(LogObserver observer) {
        observers.add(observer);
    }
    
    /**
     * 移除日志观察者
     * @param observer 观察者
     */
    public void removeObserver(LogObserver observer) {
        observers.remove(observer);
    }
    
    /**
     * 通知所有观察者
     * @param level 日志级别
     * @param message 日志消息
     */
    private void notifyObservers(String level, String message) {
        for (LogObserver observer : observers) {
            observer.update(level, message);
        }
    }
    
    /**
     * 记录信息日志
     * @param message 日志消息
     */
    public void info(String message) {
        logger.info(message);
        notifyObservers("INFO", message);
    }
    
    /**
     * 记录信息日志
     * @param message 日志消息
     * @param args 参数
     */
    public void info(String message, Object... args) {
        logger.info(message, args);
        notifyObservers("INFO", String.format(message.replace("{}", "%s"), args));
    }
    
    /**
     * 记录警告日志
     * @param message 日志消息
     */
    public void warn(String message) {
        logger.warn(message);
        notifyObservers("WARN", message);
    }
    
    /**
     * 记录警告日志
     * @param message 日志消息
     * @param args 参数
     */
    public void warn(String message, Object... args) {
        logger.warn(message, args);
        notifyObservers("WARN", String.format(message.replace("{}", "%s"), args));
    }
    
    /**
     * 记录错误日志
     * @param message 日志消息
     */
    public void error(String message) {
        logger.error(message);
        notifyObservers("ERROR", message);
    }
    
    /**
     * 记录错误日志
     * @param message 日志消息
     * @param args 参数
     */
    public void error(String message, Object... args) {
        logger.error(message, args);
        notifyObservers("ERROR", String.format(message.replace("{}", "%s"), args));
    }
    
    /**
     * 记录错误日志
     * @param message 日志消息
     * @param throwable 异常
     */
    public void error(String message, Throwable throwable) {
        logger.error(message, throwable);
        notifyObservers("ERROR", message + ": " + throwable.getMessage());
    }
    
    /**
     * 记录调试日志
     * @param message 日志消息
     */
    public void debug(String message) {
        logger.debug(message);
        notifyObservers("DEBUG", message);
    }
    
    /**
     * 记录调试日志
     * @param message 日志消息
     * @param args 参数
     */
    public void debug(String message, Object... args) {
        logger.debug(message, args);
        notifyObservers("DEBUG", String.format(message.replace("{}", "%s"), args));
    }
}
